from collections import Counter
"""
    编写一个算法来判断一个数 n 是不是快乐数。
    「快乐数」 定义为：
    对于一个正整数，每一次将该数替换为它每个位置上的数字的平方和。
    然后重复这个过程直到这个数变为 1，也可能是 无限循环 但始终变不到 1。
    如果这个过程 结果为 1，那么这个数就是快乐数。
    如果 n 是 快乐数 就返回 true ；不是，则返回 false 。
"""

class Solution:
    """
     这道题的重点是循环，说明后面的数拆着加着出现了前面出现的数字，所以会陷入循环，
     所以我们需要来记录前面出现过的数字
    """
    def isHappy(self, n: int) -> bool:
        path = set()
        def num(a):
            tem = str(a)
            d = Counter(tem)
            sum1 = 0
            for i in d.keys():
                sum1 += pow(int(i),2) * d[i]
            if sum1 == 1:
                return True
            elif sum1 in path:
                return False
            else:
                path.add(sum1)
                return num(sum1)
        return num(n)